package 栈;
import java.util.*;

/**
 * 该类实现了一个支持获取最小值的栈。
 * 时间复杂度：O(1)，空间复杂度：O(n)
 */
public class MinStack {
    private ArrayDeque<int[]> stk = new ArrayDeque<>(); // 创建一个栈来存储元素和当前最小值

    /**
     * 构造函数，初始化栈并设置初始最小值为 Integer.MAX_VALUE。
     */
    public MinStack() {
        stk.push(new int[]{0, Integer.MAX_VALUE}); // 初始化栈，第一个元素为0，第二个元素为最大值
    }

    /**
     * 将元素推入栈中，并更新当前最小值。
     * @param val 要推入栈的元素
     */
    public void push(int val) {
        stk.push(new int[]{val, Math.min(getMin(), val)}); // 推入元素和当前最小值
    }

    /**
     * 弹出栈顶元素。
     */
    public void pop() {
        stk.pop(); // 弹出栈顶元素
    }

    /**
     * 获取栈顶元素。
     * @return 栈顶元素
     */
    public int top() {
        return stk.peek()[0]; // 返回栈顶元素
    }

    /**
     * 获取栈中的最小值。
     * @return 栈中的最小值
     */
    public int getMin() {
        return stk.peek()[1]; // 返回栈中的最小值
    }

    /**
     * 主方法，处理输入并输出结果。
     * 该方法从标准输入读取操作和参数，并执行相应的操作。
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 创建扫描器对象
        String[] ins = sc.nextLine().split(","); // 读取操作
        String[] arg = sc.nextLine().split(","); // 读取参数
        MinStack ms = new MinStack(); // 创建对象
        for(int i = 0; i < ins.length; i++) {
            if(ins[i].equals("MinStack")) continue; // 忽略 MinStack 操作
            else if(ins[i].equals("push")) ms.push(Integer.parseInt(arg[i])); // 执行 push 操作
            else if(ins[i].equals("pop")) ms.pop(); // 执行 pop 操作
            else if(ins[i].equals("top")) System.out.println(ms.top()); // 执行 top 操作
            else if(ins[i].equals("getMin")) System.out.println(ms.getMin()); // 执行 getMin 操作
        }
        sc.close(); // 关闭扫描器
    }
}
